The demand for computational power continues to grow in the scientific computing and embedded systems communities. As a result, multiprocessor systems are becoming more and more common. Multiprocessing is the use of two or more central processing units (CPUs) within a single computer system. The term also refers to the ability of a system to support more than one processor and/or the ability to allocate tasks between them. There are many variations on this basic theme, and the definition of multiprocessing can vary with context, mostly as a function of how CPUs are defined (multiple cores on one die, multiple chips in one package, multiple packages in one system unit, etc.).
In a multiprocessing system, all CPUs may be equal, or some may be reserved for special purposes. A combination of hardware and operating system software design considerations determine the symmetry (or lack thereof) in a given system. For example, hardware or software considerations may require that only one CPU respond to all hardware interrupts, whereas all other work in the system may be distributed equally among CPUs; or execution of kernel-mode code may be restricted to only one processor (either a specific processor, or only one processor at a time), whereas user-mode code may be executed in any combination of processors. Multiprocessing systems are often easier to design if such restrictions are imposed, but they tend to be less efficient than systems in which all CPUs are utilized equally.
Systems that treat all CPUs equally are called symmetric multiprocessing (SMP) systems. In systems where all CPUs are not equal, system resources may be divided in a number of ways, including asymmetric multiprocessing (ASMP), non-uniform memory access (NUMA) multiprocessing, and clustered multiprocessing.
While these parallel systems address the need for increased throughput, they also introduce additional levels of programming complexity. Moreover, the advent of multicore multiprocessors adds yet another level of parallelism and complexity. These trends underscore the need for new tools and techniques for parallel programming.
The need for parallel processing is evident in both scientific and real-time computing. The need to process large quantities of data at high speeds is making parallel programming important at all levels of programming expertise. The requirement to parallelize programs can reduce productivity and prolong development.